#include <pthread.h>

#include <cstdio>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <map>
#include <memory>
#include <queue>
#include <vector>
// lambda表达式 也是函数对象
// 常用于泛型算法 参数传递 比较性质、自定义操作、优先级队列，智能指针删除器
//
// 语法
// [捕获外部变量](形参列表)->返回值{操作代码}；
// 捕获外部变量
// = 传值
// & 传引用
// ->void 可以省略不写
//
//
class Data {
public:
    Data(int a = 10, int b = 20) : a(a), b(b) {
    }
    int a;
    int b;
};

int main() {
    std::map<char, std::function<int(int, int)>> actionMap;
    actionMap['+'] = [](int a, int b) -> int { return a + b; };
    actionMap['-'] = [](int a, int b) -> int { return a - b; };
    actionMap['*'] = [](int a, int b) -> int { return a * b; };
    actionMap['/'] = [](int a, int b) -> int { return a / b; };
    actionMap['%'] = [](int a, int b) -> int { return a % b; };

    char c = '+';
    std::cout << actionMap[c](1, 2) << std::endl;

    /////////////////////////////////////////////////////////////
    std::unique_ptr<FILE, std::function<void(FILE*)>> ptr(
        fopen("data.txt", "w"), [](FILE* ptr) { fclose(ptr); });

    /////////////////////////////////////////////////////////////
    using FUNC = std::function<bool(Data&, Data&)>;
    auto comp = [](Data& a, Data& b) -> bool { return a.a < b.a; };
    std::priority_queue<Data, std::vector<Data>, FUNC> priority_queue(comp);
    priority_queue.push({2, 1});
    priority_queue.push({2, 2});
    priority_queue.push({3, 2});

    while (!priority_queue.empty()) {
        std::cout << priority_queue.top().a << " " << priority_queue.top().b
                  << std::endl;
        priority_queue.pop();
    }
}
